<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Extensible 3D (X3D), ISO/IEC FCD 19775-1r1:200x, 8 Time component</title>
<link rel="stylesheet" href="../X3D.css" type="text/css">

</head>
<BODY>

<div class="CenterDiv">
<IMG class="x3dlogo" SRC="../../Images/x3d.png" ALT="X3D logo" style="width: 176px; height: 88px"> 
</div>

<div class="CenterDiv">
<p class="HeadingPart">
    Extensible 3D (X3D)<br />
    Part 1: Architecture and base components</p>

<p class="HeadingClause">8 Time component</p>
</div>

<IMG class="x3dbar" SRC="../../Images/x3dbar.png" ALT="--- X3D separator bar ---" width="430" height="23">

<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Introduction"></a>8.1 Introduction</h1>

<h2><a name="Name"></a>8.1.1 Name</h2>

<p>The name of this component is &quot;Time&quot;. This name shall be used when referring 
to this component in the COMPONENT statement (see
<a href="core.html#COMPONENTStatement">7.2.5.4 Component statement</a>).</p>

<h2><a name="Overview"></a>8.1.2 Overview</h2>

<P>This clause describes the Time component of this part of ISO/IEC 19775. This 
  includes a definition of the TimeSensor node, the fundamental means for connecting 
  the X3D world to the time base of the browser. <a href="#t-Topics">Table 8.1</a> links to the major topics in this clause.</P>

<div class="CenterDiv">

<p class="TableCaption">
<a name="t-Topics"></a>Table 8.1 &#8212; Topics</p>

<table class="topics">
  <TR>
      <TD> 
        <ul>
          <li><a href="#Introduction">8.1 Introduction</a>
            <ul>
              <li><a href="#Name">8.1.1 Name</a></li>
              <li><a href="#Overview">8.1.2 Overview</a></li>
            </ul></li> 
          <li><a href="#Concepts">8.2 Concepts</a> 
            <ul>
              <li><a href="#Timemodel">8.2.1 Time model</a></li> 
              <li><a href="#Timeorigin">8.2.2 Time origin</a></li> 
              <li><a href="#Discreteandcontinuous">8.2.3 Discrete and continuous changes</a></li> 
              <li><a href="#Time-dependent">8.2.4 Time-dependent nodes</a>
                <ul>
                  <li><a href="#TimeDependentNodesOverview">8.2.4.1 Overview</a></li>
                  <li><a href="#Timecycles">8.2.4.2 Time cycles</a></li> 
                  <li><a href="#Timeactivation">8.2.4.3 Time activation</a></li> 
                  <li><a href="#PausingTime">8.2.4.4 Pausing time</a></li>
                </ul></li>
            </ul></li>
          <li><a href="#Abstracttypes">8.3 Abstract types</a> 
            <ul>
              <li><a href="#X3DTimeDependentNode">8.3.1 <i>X3DTimeDependentNode</i></a></li> 
            </ul></li>
          <li><a href="#Nodereference">8.4 Node reference</a> 
            <ul>
              <li><a href="#TimeSensor">8.4.1 TimeSensor</a></li> 
            </ul></li>
          <li><a href="#SupportLevels">8.5 Support levels</a></li>
        </ul>
        <ul>
          <li><a href="#f-Examples">Figure 8.1 &#8212; Examples of time-dependent node execution</a></li> 
        </ul>
        <ul>
          <li><a href="#t-Topics">Table 8.1 &#8212; Topics</a></li>
          <li><a href="#t-supportlevels">Table 8.2 &#8212; Time component support levels</a></li>
        </ul>
      </TD>
</TR>
</TABLE>
</DIV>

<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Concepts"></A>
8.2 Concepts</H1>

<h2><a name="Timemodel"></a>
8.2.1 Time model</h2>

<P>The browser controls the passage of time in a world by causing 
<a href="#TimeSensor">TimeSensor</a> nodes to 
generate events as time passes. Specialized browsers or authoring applications 
may cause time to pass more quickly or slowly than in the real world, but 
typically the times generated by TimeSensor nodes will approximate "real" time. A 
world's creator should make no assumptions about how often a TimeSensor will 
generate events but can safely assume that each time event generated will have a 
timestamp greater than any previous time event.</P>

<H3><a name="Timeorigin"></a>
8.2.2 Time origin</H3>

<P>Time (0.0) is equivalent to 00:00:00 GMT January 1, 1970. Absolute times are 
specified in SFTime or MFTime fields as double-precision floating point numbers 
representing seconds. Negative absolute times are interpreted as happening 
before 1970.</P>

<P>Processing an event with timestamp <I>t</I> may only result in generating 
events with timestamps greater than or equal to <I>t</I>.</P>

<h2><a name="Discreteandcontinuous"></a>
8.2.3 Discrete and continuous changes</H2>

<P>This International Standard does not distinguish between discrete events (such as those 
generated by a <a href="pointingsensor.html#TouchSensor">TouchSensor</a>) and events that are the result of sampling a 
conceptually continuous set of changes (such as the fraction events generated by 
a <a href="#TimeSensor">TimeSensor</a>). An ideal X3D implementation would generate an infinite number of 
samples for continuous changes, each of which would be processed infinitely 
quickly.</P>

<P>Before processing a discrete event, all continuous changes that are occurring 
at the discrete event's timestamp shall behave as if they generate events at 
that same timestamp.</P>

<P>Beyond the requirements that continuous changes be up-to-date during the 
processing of discrete changes, the sampling frequency of continuous changes is 
implementation dependent. Typically, a TimeSensor affecting a visible (or 
otherwise perceptible) portion of the world will generate events once per 
<I>frame</I>, where a frame is a single rendering of the world or one time-step 
in a simulation.</P>

<h2><a name="Time-dependent"></a>
8.2.4 Time-dependent nodes</H2>

<h3><a name="TimeDependentNodesOverview"></a>8.2.4.1 Overview</h3>

<P><A href="sound.html#AudioClip">AudioClip</A>, 
<A href="texturing.html#MovieTexture">MovieTexture</A>, 
and 
<A href="time.html#TimeSensor">TimeSensor</A> are examples of nodes that 
  are of <a href="#X3DTimeDependentNode">X3DTimeDependentNode</a> type and that activate, 
  pause, resume, and deactivate instantiations of themselves at specified times. 
  Each of these node types contains the inputOutput fields: <I>startTime</I>, <I>pauseTime, 
  resumeTime, stopTime</I>, and <I>loop,  elapsedTime, isActive, 
  and isPaused</I>. The values of the inputOutput fields are used to determine when 
  an instantiated node becomes active or inactive and enters or exits a paused 
  state. Also, under certain conditions, these instantiated nodes ignore events 
  to some of their inputOutput fields. A node ignores an input event by not accepting 
  the new value and not generating an xxx<I>_changed</I> event. An abstract 
  time-dependent node type can be realized as any one of AudioClip, MovieTexture, or TimeSensor.</P>

<h3><a name="Timecycles"></a>
8.2.4.2 Time cycles</h3>

<P>Time-dependent nodes execute in cycles. A cycle is 
  defined by field data within the node. If, at the end of a cycle, the value 
  of <I>loop</I> is <code>FALSE</code>, execution is terminated (see 
  below for events at termination). Conversely, if <I>loop</I> is <code>TRUE</code> 
at the end of a cycle, a time-dependent node continues execution 
  into the next cycle. Thus, a time-dependent node with <I>loop</I>
<span class="code">TRUE</span> at the end 
  of every cycle continues cycling forever 
if <I>startTime&nbsp;&ge;&nbsp;stopTime</I>, 
  or until <I>stopTime </I>if<I> startTime &lt; stopTime</I>, or until the 
  conditions to pause are set.</P>

<P>The <i>elapsedTime</i> outputOnly field delivers the current elapsed time since 
  the TimeSensor was activated and running, cumulative in seconds and not counting 
  any time while in a paused state. </P>

<h3><a name="Timeactivation"></a>
8.2.4.3 Time activation</h3>

<P>The default values for each of the time-dependent nodes are specified such 
  that any node with default values is already inactive and resumed (and, therefore, 
  will generate no events upon loading). A time-dependent node can be defined 
  such that it will be active upon reading by specifying <i>loop</i> <code>TRUE</code>. 
This use of a non-terminating time-dependent 
  node should be used with caution since it incurs continuous overhead on the 
  simulation.</P>

<P>A time-dependent node generates an <I>isActive</I> <code>TRUE</code> 
event when it becomes active and generates an <I>isActive</I> 
  <code>FALSE</code> event when it becomes inactive. These are 
  the only times at which an <I>isActive</I> event is generated. In particular, 
  <I>isActive </I>events are not sent at each tick of a simulation.</P>

<P>A time-dependent node is inactive until its <I>startTime</I> is reached. When 
time <I>now</I> becomes greater than or equal to <I>startTime, </I>an 
<I>isActive</I> <code>TRUE</code> event is generated and the 
time-dependent node becomes active (<I>now</I> refers to the time at which the 
browser is simulating and displaying the virtual world). When a time-dependent 
node is read from a X3D file and the ROUTEs specified within the X3D file have 
been established, the node should determine if it is active and, if so, generate 
an <I>isActive</I> <code>TRUE</code> event and begin 
generating any other necessary events. However, if a node would have become 
inactive at any time before the reading of the X3D file, no events are generated 
upon the completion of the read.</P>

<P>An active time-dependent node will become inactive when <I>stopTime</I> is 
reached if <I>stopTime&nbsp;&gt;&nbsp;startTime.</I> The value of<I> stopTime 
</I>is ignored if<I> stopTime&nbsp;&le;&nbsp;startTime</I>. Also, an active 
time-dependent node will become inactive at the end of the current cycle if 
<I>loop</I> is <code>FALSE</code>. If an active 
time-dependent node receives a <I>set_loop</I> <code>FALSE</code> event, 
execution continues until the end of the 
current cycle or until <I>stopTime</I> (if 
<I>stopTime&nbsp;&gt;&nbsp;startTime</I>), whichever occurs first. The 
termination at the end of cycle can be overridden by a subsequent <I>set_loop 
</I><code>TRUE</code> event.</P>

<P>Any <I>set_startTime</I> events to an active time-dependent node are ignored. 
Any <I>set_stopTime</I> event where <I>stopTime</I> &le; <I>startTime</I> sent 
to an active time-dependent node is also ignored. A <I>set_stopTime</I> event 
where <I>startTime&nbsp;&lt;&nbsp;stopTime&nbsp;&le;&nbsp;now</I> sent to an 
active time-dependent node results in events being generated as if 
<I>stopTime</I> has just been reached. That is, final events, including an 
<I>isActive </I><code>FALSE</code>, are generated and the 
node becomes inactive. The <I>stopTime_changed</I> event will have the 
<I>set_stopTime</I> value. Other final events are node-dependent 
(see&nbsp;<a href="#TimeSensor">8.4.1 TimeSensor</a>).</P>

<P>A time-dependent node may be restarted while it is active by sending a <I>set_stopTime</I> 
  event equal to the current time (which will cause the node to become inactive) 
  and a <I>set_startTime</I> event, setting it to the current time or any time 
  in the future. These events will have the same time stamp and should be processed 
  as <I>set_stopTime, </I>then<I> set_startTime </I>to produce the correct behaviour.</P>

<h3><a name="PausingTime"></a>
8.2.4.4 Pausing Time</h3>

<P>While an active time-dependent node is paused, it generates
<span class="code">TRUE</span><i> isPaused</i> 
  and <i>pauseTime_changed</i> events and ceases to generate all other output 
events, while maintaining (or &quot;freezing&quot;) its state (holding the last output 
  values and the clock's internal time when the pausing conditions are met). </P>

<p>An active time-dependent node may be paused when its SFTime fields are such 
that<i> now ≥ pauseTime </i>&gt; <i>resumeTime</i>. When a time-dependent node is 
paused, the time-dependent node shall send out a <span class="code">TRUE</span> 
event on <i>isPaused</i> and a <i>pauseTime_changed</i> event reporting the 
simulation time when the node was paused.</p>
<p>An active but paused time-dependent node shall resume at the first simulation 
tick when <i>now</i>&nbsp;≥ <i>resumeTime</i>&nbsp;&gt; <i>pauseTime</i>. The time-dependent 
node then resumes generating its output events from the paused state at the 
simulation tick. A <i>resumeTime_changed</i> event is also generated reporting 
the simulation time when the node was resumed.</p>

<P><a href="#f-Examples">Figure 8.1</a> 
illustrates the behavior of several common cases of time-dependent 
nodes. In each case, the initial conditions of <i>startTime</i>, <i>stopTime</i>, <i>loop</i>, and the time-dependent node's cycle interval are labelled, the red region denotes the time period during which the time-dependent 
node is active, the arrows represent input events received by, and output events sent by, 
the time-dependent node, and the horizontal axis represents time.</P>

<div class="CenterDiv">
<a name="f-Examples"></a>

<IMG src="../../Images/timeDep.gif" alt="Time dependent examples" width="336" height="668" >

<p class="FigureCaption">
Figure 8.1 &#8212; Examples of time-dependent node execution</p>

</div>

<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Abstracttypes"></A>
8.3 Abstract types</H1>

<h2><a name="X3DTimeDependentNode"></a>
8.3.1 <i>X3DTimeDependentNode</i></h2>

<pre class="node">X3DTimeDependentNode : X3DChildNode {
  SFBool  [in,out] loop         FALSE
  SFNode  [in,out] metadata     NULL  [X3DMetadataObject]
  SFTime  [in,out] pauseTime    0     (-&#8734;,&#8734;)
  SFTime  [in,out] resumeTime   0     (-&#8734;,&#8734;)
  SFTime  [in,out] startTime    0     (-&#8734;,&#8734;)
  SFTime  [in,out] stopTime     0     (-&#8734;,&#8734;)
  SFTime  [out]    elapsedTime
  SFBool  [out]    isActive
  SFBool  [out]    isPaused
}
</pre>

<p>This abstract node type is the base node type from which all time-dependent 
nodes 
  are derived. 
  <a href="#Concepts">8.2 Concepts</a>, contains a detailed discussion of 
time-dependent nodes.</p>

<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="Nodereference"></a>
8.4 Node reference</h1>


<h2><a name="TimeSensor"></a>
8.4.1 TimeSensor</h2>

<PRE class="node">TimeSensor : X3DTimeDependentNode, X3DSensorNode {
  SFTime  [in,out] cycleInterval    1     (0,&#8734;)
  SFBool  [in,out] enabled          TRUE
  SFBool  [in,out] loop             FALSE
  SFNode  [in,out] metadata         NULL  [X3DMetadataObject]
  SFTime  [in,out] pauseTime        0     (-&#8734;,&#8734;)
  SFTime  [in,out] resumeTime       0
  SFTime  [in,out] startTime        0     (-&#8734;,&#8734;)
  SFTime  [in,out] stopTime         0     (-&#8734;,&#8734;)
  SFTime  [out]    cycleTime
  SFTime  [out]    elapsedTime
  SFFloat [out]    fraction_changed
  SFBool  [out]    isActive
  SFBool  [out]    isPaused
  SFTime  [out]    time
}
</PRE>

<p>TimeSensor nodes generate events as time passes. TimeSensor nodes can be used 
  for many purposes including:</p>

<!--/NOEDIT-->
<OL type=a>
  <LI>driving continuous simulations and animations;</li>
  <LI>controlling periodic activities (<I>e.g.</I>, one per minute);</li> 
  <LI>initiating single occurrence events such as an alarm clock. </LI>
</OL>
<!--/NOEDIT-->

<P>The TimeSensor node contains two discrete outputOnly fields: <I>isActive</I> and 
<I>cycleTime</I>. The <I>isActive</I> outputOnly field sends <code>TRUE</code> 
when the TimeSensor node begins running, and 
<code>FALSE</code> when it stops running. The 
<I>cycleTime</I> outputOnly field sends a time event at <I>startTime</I> and at the 
beginning of each new cycle (useful for synchronization with other time-based 
objects). The remaining outputOnly fields generate continuous events. The 
<I>fraction_changed</I> outputOnly field, an SFFloat in the closed interval [0,1], sends 
the completed fraction of the current cycle. The <I>time</I> outputOnly field sends the 
absolute time for a given <I>simulation tick</I>.</P>

<P>If the <I>enabled</I> field is <code>TRUE</code>, the 
TimeSensor node is enabled and may be running. 
If a <I>set_enabled </I><code>FALSE</code> 
event is received while the TimeSensor node is 
running, the sensor performs the following actions:</P>

<OL type=a start=4>
  <LI>evaluates and sends all relevant outputs;</li> 
  <LI>sends a <code>FALSE</code> value for <I>isActive</I>;</li> 
  <LI>disables itself.</LI>
</OL>
<!--/NOEDIT-->

<P>Input events on the fields of the TimeSensor node 
(<i>e.g.</i>, <I>set_startTime) </I>are processed and their corresponding 
 
outputOnly fields (<i>e.g.</i>, <I>startTime_changed)</I> are sent regardless of the state 
of the <I>enabled </I>field. The remaining discussion assumes <I>enabled</I> is 
<code>TRUE</code>.</P>

<P>The <I>loop, startTime, </I><I>stopTime</I> and <I>isActive</I> fields and 
their effects on the TimeSensor node are discussed in detail in <A 
href="#Concepts">8.2 Concepts</a>. 
The "cycle<I>"</I> of a TimeSensor node lasts for 
<I>cycleInterval</I> seconds. The value of <I>cycleInterval</I> shall be greater 
than zero.</P>

<P>A <I>cycleTime</I> outputOnly field can be used for synchronization purposes such as 
sound with animation. The value of a <I>cycleTime</I> event will be equal to the 
time at the beginning of the current cycle. A <I>cycleTime </I>event is 
generated at the beginning of every cycle, including the cycle starting at 
<I>startTime</I>. The first <I>cycleTime</I> event for a TimeSensor node can be 
used as an alarm (single pulse at a specified time).</P>

<P>When a TimeSensor node becomes active, it generates an <I>isActive = 
</I><code>TRUE</code> event and<I> </I>begins generating 
<I>time,</I> <I>fraction_changed,</I> and <I>cycleTime </I>events which may be 
routed to other nodes to drive animation or simulated behaviours. The behaviour 
at read time is described below. The<I> time</I> event sends the absolute time 
for a given tick of the TimeSensor node (<a href="../fieldsDef.html#SFTime">SFTime/MFTime</a> 
fields and events represent the number of seconds since midnight GMT 
January 1, 1970).</P>

<P><I>fraction_changed</I> events output a floating point value in the closed 
interval [0,&nbsp;1]. At <I>startTime</I> the value of <I>fraction_changed</I> 
is 0. After <I>startTime,</I> the value of <I>fraction_changed</I> in any cycle 
will progress through the range (0.0, 1.0]. At
<I>startTime&nbsp;+&nbsp;</I>N &times; <I>cycleInterval, </I>for N = 1, 2, 
..., (<i>i.e.</i>, at the end of every cycle), the value of <I>fraction_changed</I> is 
1.</P>

<P>Let <I>now</I> represent the time at the current simulation tick. Then the 
<I>time</I> and <I>fraction_changed </I>output-only fields<I> </I>can then be computed 
as:</P> 

<pre class="listing"><I>time </I>= <I>now</I>

temp = (<I>now</I> - startTime) / cycleInterval
   f = fractionalPart(temp)

 if (f == 0.0 &amp;&amp; <I>now</I> &gt; startTime) <I>fraction_changed</I> = 1.0
 else <I>fraction_changed</I> = f
</PRE>

<P>where<TT> fractionalPart(x) </TT>is a function that returns the fractional 
part, (that is, the digits to the right of the decimal point), of a nonnegative 
floating point number.</P>

<P>A TimeSensor node can be set up to be active at read time by specifying 
<I>loop</I> <code>TRUE</code> (not the default) and 
<I>stopTime&nbsp;</I>less than or equal to<I>&nbsp;startTime</I> (satisfied by 
the default values). The <I>time</I> events output absolute times for each tick 
of the TimeSensor node simulation. The <I>time</I> events shall start at the 
first simulation tick greater than or equal to <I>startTime.</I> <I>time</I> 
events end at <I>stopTime</I>, or at 
<I>startTime&nbsp;</I>+&nbsp;<I>N</I> &times; <I>cycleInterval</I> for some 
positive integer value of <I>N</I>, or loop forever depending on the values of 
the other fields. An active TimeSensor node shall stop at the first simulation 
tick when 
<I>now</i>&nbsp;&ge;&nbsp;<I>stopTime</i>&nbsp;&gt;&nbsp;<i>startTime</I>.</P>

<P>No guarantees are made with respect to how often a TimeSensor node generates 
time events, but a TimeSensor node shall generate events at least at every 
simulation tick. TimeSensor nodes are guaranteed to generate final <I>time</I> 
and <I>fraction_changed</I> events. If loop is <span class="code">FALSE</span> at the end of the 
<I>N</I>th cycleInterval and was <code>TRUE</code> at 
<I>startTime&nbsp;+&nbsp;M&nbsp;</I><I>cycleInterval</I> for all 
<I>0&nbsp;&lt;&nbsp;M&nbsp;&lt;&nbsp;N</I>, the final <I>time</I> event will be 
generated with a value of 
(<I>startTime&nbsp;+&nbsp;N</I> &times; <I>cycleInterval</I>) 
or <I>stopTime (</I>if <I>stopTime&nbsp;</I>&gt;&nbsp;<I>startTime),</I> 
whichever value is less. 
If <I>loop</I> is <span class="code">TRUE</span> at the completion of every cycle, the final event 
is generated as evaluated at <I>stopTime</I> 
(if <I>stopTime&nbsp;</I>&gt;&nbsp;<I>startTime)</I> or <I>never</I>.</P>

<P>An active TimeSensor node ignores <I>set_cycleInterval</I> and 
<I>set_startTime</I> events. An active TimeSensor node also ignores 
<I>set_stopTime</I> events for <I>set_stopTime&nbsp;</I>less than or equal 
to<I>&nbsp;startTime</I>. For example, if a <I>set_startTime</I> event is 
received while a TimeSensor node is active, that <I>set_startTime</I> event is 
ignored (the <I>startTime</I> field is not changed, and a 
<I>startTime_changed</I> event is not generated). If an active TimeSensor node 
receives a<I> set_stopTime</I> event that is less than the current time, and 
greater than <I>startTime</I>, it behaves as if the <I>stopTime</I> requested is 
the current time and sends the final events based on the current time (note that 
<I>stopTime </I>is set as specified in the field).</P>

<P>A TimeSensor read from a X3D file shall 
generate <I>isActive </I><code>TRUE</code>, <I>time</I> 
and <I>fraction_changed</I> events 
if the sensor is enabled and all conditions for a TimeSensor to be active are 
met.</P>

<h1><img class="cube" src="../../Images/cube.gif" alt="cube" width="20" height="19">
<a name="SupportLevels"></a>8.5 Support levels</H1>

<p>The Time component provides four levels of support as specified in 
<a href="#t-supportlevels">Table 8.2</a>. Level 1 provides basic support for TimeSensor. Level 2 adds support for all of 
  the fields of the TimeSensor node. 

<div class="CenterDiv">

<p class="TableCaption">
<a name="t-supportlevels"></a>
Table 8.2 &#8212; Time component support levels</p>

   <table>
      <tr> 
        <th>Level</th>
        <th>Prerequisites</th>
        <th><b>Nodes/Features</b></th>
        <th>Support</th>
      </tr>
      <tr> 
        <td align="center"><b>1</b></td>
        <td>Core 1</td>
        <td</td>
        <td></td>
      </tr>
      <tr>
        <td align="center">&nbsp;</td>
        <td></td>
        <td><i>X3DTimeDependentNode</i> (abstract)</td>
        <td>n/a</td>
      </tr>
      <tr> 
        <td align="center">&nbsp;</td>
        <td></td>
        <td>TimeSensor</td>
        <td><i>pause</i> optionally supported.<br>
        <i>isPaused</i> optionally supported. <i>resumeTime</i> optionally 
        supported.</td>
      </tr>
      <tr> 
        <td align="center"><b>2</b></td>
        <td>Core 1</td>
        <td></td>
        <td></td>
      </tr>
      <tr> 
        <td align="center"></td>
        <td></td>
        <td>Level 1 supported node</td>
        <td>All fields as supported by Level 
          1.</td>
      </tr>
      <tr> 
        <td align="center"></td>
        <td></td>
        <td>TimeSensor</td>
        <td>All fields fully supported.</td>
      </tr>
    </table>
</div>

<img class="x3dbar" SRC="../../Images/x3dbar.png" ALT="--- X3D separator bar ---" width="430" height="23" />

</body>
</html>